package com.fasterxml.aalto.in;

/**
 * Specialized implementation of PName: can be used for medium-sized Strings
 * that consists of at most 9-12 bytes. These are less frequent than
 * shorter variations, but still somewhat common.
 *<p>
 * The reason for such specialized classes is mostly space efficiency;
 * and to a lesser degree performance. Both are achieved for short
 * Strings by avoiding another level of indirection (via quad arrays)
 */
public final class PName3
    extends ByteBasedPName
{
    final int mQuad1;
    final int mQuad2;
    final int mQuad3;

    PName3(String pname, String prefix, String ln, int hash, int[] quads)
    {
        super(pname, prefix, ln, hash);
        mQuad1 = quads[0];
        mQuad2 = quads[1];
        mQuad3 = quads[2];
    }

    PName3(String pname, String prefix, String ln, int hash, int q1, int q2, int q3)
    {
        super(pname, prefix, ln, hash);
        mQuad1 = q1;
        mQuad2 = q2;
        mQuad3 = q3;
    }

    @Override
    public PName createBoundName(NsBinding nsb)
    {
        PName3 newName = new PName3(_prefixedName, _prefix, _localName, mHash,
                                    mQuad1, mQuad2, mQuad3);
        newName._namespaceBinding = nsb;
        return newName;
    }

    @Override
    public boolean equals(int quad1, int quad2) {
        // Implies quad length < 3, never matches
        return false;
    }

    @Override
    public boolean equals(int[] quads, int qlen)
    {
        return (qlen == 3)
            && (quads[0] == mQuad1)
            && (quads[1] == mQuad2)
            && (quads[2] == mQuad3);
    }

    @Override
    public boolean hashEquals(int h, int quad1, int quad2) {
        // Implies quad length < 3, never matches
        return false;
    }

    @Override
    public boolean hashEquals(int h, int[] quads, int qlen) {
        return (h == mHash) && (qlen == 3)
                && (quads[0] == mQuad1)
                && (quads[1] == mQuad2)
                && (quads[2] == mQuad3);
    }

    @Override
    public int getFirstQuad() {
        return mQuad1;
    }

    @Override
    public int getLastQuad() {
        return mQuad3;
    }

    @Override
    public int getQuad(int index)
    {
        if (index < 2) {
            return (index == 0) ? mQuad1 : mQuad2;
        }
        // Whatever would be returned for invalid index is arbitrary, so:
        return mQuad3;
    }

    @Override
    public int sizeInQuads() { return 3; }
}
